#include "poly.h"

struct node_st *poly_create(int a[][2], int num)
{
     struct node_st *p, *newnode, *current;

     p = malloc(sizeof(struct node_st)); //创建头结点
     if (p == NULL)
	     return NULL;
     p->next = NULL;

     current = p;
     for (int i = 0; i < num; i++)
     {
	     newnode = malloc(sizeof(*newnode));
	     newnode->coef = a[i][0];
	     newnode->exp = a[i][1];
	     newnode->next = NULL;
	     current->next = newnode;
	     current = newnode;
     }
     return p;
}
void poly_show(struct node_st * p)
{
	struct node_st *current = p->next;
	while (current)
	{
		printf("%dX^%d", current->coef, current->exp);
		if (current->next != NULL)
		{
			if (current->next->coef > 0)
				printf("+");
		}
		current = current->next;
	}
	printf("\n");
	
}
void poly_union(struct node_st* p1,struct node_st* p2)
{
	struct node_st *ptr1 = p1->next, *ptr2 = p2->next;
	struct node_st *current = p1;
	while (ptr1 && ptr2)
	{
		if (ptr1->exp < ptr2->exp)
		{
			current->next = ptr1;
			current = ptr1;
			ptr1 = ptr1->next;
		}
		else if (ptr1->exp > ptr2->exp)
		{
			current->next = ptr2;
			current = ptr2;
			ptr2 = ptr2->next;
		}
		else
		{
			ptr1->coef += ptr2->coef;
			if(ptr1->coef)   //这里应该采用fabs函数
			{
				current->next = ptr1;
				current = ptr1;
			}
			ptr1 = ptr1->next;
			ptr2 = ptr2->next;
		}
	}
	if (ptr1)
		current->next = ptr1;
	else
		current->next = ptr2;
}
//废
//void poly_mul(struct node_st* p1,struct node_st* p2)
//{
//	struct node_st *ptr1 = p1->next, *ptr2 = p2->next;
//	struct node_st *p = p1->next, *q = p2->next;
//	
//	int i = 0;
//	struct node_st *current = p2->next;
//	while (current != NULL)        //计算被乘多项式的项数
//	{
//		i++;
//		current = current->next;
//	} 
//	printf("i = %d\n", i);
//
//	int **pa = malloc(sizeof(int) * i);
//	int **pb = malloc(sizeof(int) * i);
//	for (int k = 0; k < i; k++)
//	{
//		pa[k] = malloc(sizeof(int) * 2);
//		pb[k] = malloc(sizeof(int) * 2);
//	}
//	struct node_st *pb1 = poly_create(pa, i);
//	struct node_st *pb2 = poly_create(pb, i);
//
//	int j = 0;
//	while(ptr1 != NULL)
//	{
//		j = 0;
//		q = p2->next;
//		if(ptr1 == p1->next)
//		{
//			while(q != NULL)
//			{
//				printf("coef:%d %d\n", p->coef, q->coef);
//				pb1->coef = p->coef * q->coef;
//				pb1->exp = p->exp + q->exp;
//				q = q->next;
//				j++;
//			}
//			break;
//		}
//
//		while (q != NULL)
//		{
//			printf("coef:%d %d\n", p->coef, q->coef);
//			pb2->coef = p->coef * q->coef;
//			pb2->exp = p->exp + q->exp;
//			q = q->next;
//			j++;
//		}
//		poly_union(pb1,pb2);
//
//		ptr1 = ptr1->next;
//	}
//}

//(老师写的)
//void poly_union(struct node_st* p1,struct node_st* p2)
//{
//	struct node_st *p, *q,*r;
//	p = p1->next;
//	q = p2->next;
//	r = p1;
//	while(p && q)
//	{
//		if (p->exp < q->exp)
//		{
//			r->next = p;
//			r = p;
//			p = p->next;
//		}
//		else if (p->exp > q->exp)
//		{
//			r->next = q;
//			r = q;
//			q = q->next;
//		}
//		else
//		{
//			p->coef += q->coef;
//			if (p->coef)
//			{
//				r->next = p;
//				r = p;
//			}
//			p = p->next;
//			q = q->next;
//		}
//	}
//	if(p == NULL)
//		r->next = q;
//	else r->next = p;
//}